<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>


  <script>
   /* 
    使用构造函数和ES6的类设计并测试以下需要
      需求1: 
        现在2个人, 都有姓名与年龄(值自己指定), 都能自我介绍自己的姓名和年龄, 能得到当前的总人数
      需求2: 
        现在又有了一个学生, 它有身价的属性, 能介绍它的所有信息
        又有一个老师, 它有教授课程的属性, 能介绍它的所有信息
  */

  /* 
  ***方式一: 基于构造函数的继承: 原型链 + 借用构造函数的组合式继承***

  - ***借用父类型构造函数: Person.call(this, name, age)***
  - ***让子类的原型为父类的实例: Student.prototype = new Person()***
  - ***让子类型原型的构造器为子类型: Student.prototype.constructor = Student***
  */

    function Person(name, age) {
      this.name = name
      this.age = age
      Person.prototype.count++
    }
    Person.prototype.sayInfo = function () {
      console.log(`我叫: ${this.name}, 年方: ${this.age}`)
    }
    Person.prototype.count = 0

    // const p1 = new Person('A', 12)
    // const p2 = new Person('B', 13)
    // p1.sayInfo()
    // p2.sayInfo()
    // console.log(p1.count, p2.count)


    function Student(name, age, price) {
      // this.name = name
      // this.age = age
      /* 借用父类型的构造函数  ==> 简化编码 */
      // Person(name, age)
      Person.call(this, name, age)
      this.price = price
    }
    /* 让子类的原型为父类的实例 */
    Student.prototype = new Person()
    /* 让子类型原型的构造器为子类型 */
    Student.prototype.constructor = Student
    Student.prototype.sayInfo = function () {
      console.log(`我叫: ${this.name}, 年方: ${this.age}, 身价: ${this.price}`)
    }

    const s1 = new Student('A', 21, 13000)

    s1.sayInfo()
    console.log(s1.constructor, s1)


  /* 
  ***方式二: 基于class/类的继承***

- ***子类 extends 父类: class Teacher extends Person2***
- ***子类构造器中调用父类的构造: super(name, age)***
  */
    class Person2 {

      static xxx = 123

      constructor (name, age) {
        this.name = name
        this.age = age
        Person2.prototype.count++
      }
      sayInfo () {
        console.log(`我叫: ${this.name}, 年方: ${this.age}`)
      }
    }
    Person2.prototype.count = 0

    class Teacher extends Person2 {
      constructor (name, age, course) {
        super(name, age)
        this.course = course
      }

      // 重写从父类继承得到的方法
      sayInfo () {
        console.log(`我叫: ${this.name}, 年方: ${this.age}, 课程: ${this.course}`)
      }
    }

    const t1 = new Teacher('B', 34, 'aaaaaaa')
    console.log(t1.name, t1.age, t1.course)
    t1.sayInfo()
  </script>
  
</body>
</html>